package zhangtao.bwie.com.my_im_demo;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.hyphenate.EMCallBack;
import com.hyphenate.EMMessageListener;
import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMConversation;
import com.hyphenate.chat.EMMessage;
import com.hyphenate.chat.EMMessageBody;
import com.hyphenate.chat.EMTextMessageBody;

import java.util.List;

/**
 * Created by ZhangTAO on 2018/1/30.
 */

public class Chat_act extends AppCompatActivity implements EMMessageListener{

    private TextView text_show;
    private Button btn_send;
    private EditText edit_massage_input;
    private String mChatId;
    private EMMessageListener messageListener;
    private EMConversation emConversation;
    private TextView textView;
    private TextView backs;
    private TextView adds;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_im);
        // 获取当前会话的username(如果是群聊就是群id)
        mChatId = getIntent().getStringExtra("ec_chat_id");
        messageListener = (EMMessageListener) this;
        initView();
        initConversation();
    }

    private void initView() {
        edit_massage_input = findViewById(R.id.edit_massage_input);
        btn_send = findViewById(R.id.btn_send);
        textView = text_show = findViewById(R.id.text_show);
        backs = findViewById(R.id.back_text);
        adds = findViewById(R.id.add_grounp);
        backs.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
        // 设置textview可滚动，需配合xml布局设置
        text_show.setMovementMethod(new ScrollingMovementMethod());
        //设置发送按钮的点击事件
        btn_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String trim = edit_massage_input.getText().toString().trim();
                if(!TextUtils.isEmpty(trim)) {
                    edit_massage_input.setText("");
                    // 创建一条新消息，第一个参数为消息内容，第二个为接受者username
                    EMMessage message = EMMessage.createTxtSendMessage(trim, mChatId);
                    // 将新的消息内容和时间加入到下边
                    text_show.setText(text_show.getText() + "\n" + trim + "  -> : " + message.getMsgTime());
                    // 调用发送消息的方法
                    EMClient.getInstance().chatManager().sendMessage(message);
                    //为消息设置回调
                    message.setMessageStatusCallback(new EMCallBack() {
                        @Override
                        public void onSuccess() {
                            // 消息发送成功，打印下日志，正常操作应该去刷新ui
                            Log.i("lzan13", "send message on success");
                        }
                        @Override
                        public void onError(int i, String s) {
                            // 消息发送失败，打印下失败的信息，正常操作应该去刷新ui
                            Log.i("lzan13", "send message on error " + i + " - " + s);
                        }
                        @Override
                        public void onProgress(int i, String s) {
                            // 消息发送进度，一般只有在发送图片和文件等消息才会有回调，txt不回调
                        }
                    });
                }
            }
        });
    }

    /**
     * 初始化回话对象，并且根据需求加载跟多消息
     */
    private void initConversation() {
        /**
         * 初始化会话对象，这里有三个参数么，
         * 第一个表示会话的当前聊天的 useranme 或者 groupid
         * 第二个是绘画类型可以为空
         * 第三个表示如果会话不存在是否创建
         */
        emConversation = EMClient.getInstance().chatManager().getConversation(mChatId, null, true);
        //设置当前会话未读数为0
        emConversation.markAllMessagesAsRead();
        int count = emConversation.getAllMessages().size();
        if(count < emConversation.getAllMsgCount() && count < 20) {
            // 获取已经在列表中的最上边的一条消息id
            String msgId = emConversation.getAllMessages().get(0).getMsgId();
            // 分页加载更多消息，需要传递已经加载的消息的最上边一条消息的id，以及需要加载的消息的条数
            emConversation.loadMoreMsgFromDB(msgId, 20 - count);
        }
        // 打开聊天界面获取最后一条消息内容并显示
        if (emConversation.getAllMessages().size() > 0) {
            EMMessage messge = emConversation.getLastMessage();
            EMTextMessageBody body = (EMTextMessageBody) messge.getBody();
            // 将消息内容和时间显示出来
            text_show.setText(body.getMessage() + " - " + emConversation.getLastMessage().getMsgTime());
        }
    }
    /**
     * 自定义实现Handler,刷新UI
     */
    Handler ler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
//            super.handleMessage(msg);
            switch (msg.what) {
                case 0:
                    EMMessage message = (EMMessage) msg.obj;
                    // 这里只是简单的demo，也只是测试文字消息的收发，所以直接将body转为EMTextMessageBody去获取内容
                    EMTextMessageBody body = (EMTextMessageBody) message.getBody();
                    // 将新的消息内容和时间加入到下边
                    text_show.setText(text_show.getText() + "\n" + body.getMessage() + " : <- " + message.getMsgTime());
                    break;
            }
        }
    };

    @Override
    protected void onResume() {
        super.onResume();
        //添加消息监听
        EMClient.getInstance().chatManager().addMessageListener(messageListener);
    }

    @Override
    protected void onStop() {
        super.onStop();
        //移除消息监听
        EMClient.getInstance().chatManager().removeMessageListener(messageListener);
    }
    //———————————————————————————Message Listener
    /**
     * 收到新消息
     */
    @Override
    public void onMessageReceived(List<EMMessage> list) {
        //循环遍历当前收到的消息
        for(EMMessage message : list) {
            if(message.getFrom().equals(mChatId)) {
                //设置消息为已读
                emConversation.markMessageAsRead(message.getMsgId());
                //因为消息监听回调这里是非ui线程，所以用Handler去跟新ui
                Message msg = ler.obtainMessage();
                msg.what = 0;
                msg.obj = message;
                ler.sendMessage(msg);
            }
        }
    }

    /**
     * 收到新的CMD消息
     */
    @Override
    public void onCmdMessageReceived(List<EMMessage> list) {
        for(int i=0;i < list.size();i++) {
            //透传消息
            EMMessage cmdMessage = list.get(i);
            EMMessageBody body = cmdMessage.getBody();
        }
    }
    @Override
    public void onMessageRead(List<EMMessage> list) {

    }
    @Override
    public void onMessageDelivered(List<EMMessage> list) {

    }
    @Override
    public void onMessageChanged(EMMessage emMessage, Object o) {

    }
}
